﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using InterfazGrafico.LibreriaConstantes.Elementos;

namespace InterfazGrafico.LibreriaClases.Formularios
{
    /// <summary>
    /// Gestiona la modificación de una condición de transformación.
    /// </summary>
    public partial class FormDetalleCondicion : Form
    {
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="condicion">Función de la condición</param>
        /// <param name="campoCondicion">Campo al que aplicar la condición</param>
        /// <param name="parametroCondicion1">Primer parámetro de la función de la condición</param>
        /// <param name="parametroCondicion2">Segundo parámetro de la función de la condición</param>
        /// <param name="transformacionVerdadero">Función de transformación si se cumple la condición</param>
        /// <param name="origenVerdadero">Campo origen de la transformación si se cumple la condición</param>
        /// <param name="destinoVerdadero">Campo destino de la transformación si se cumple la condición</param>
        /// <param name="parametroVerdadero1">Primer parámetro de la función de transformación si se cumple la condición</param>
        /// <param name="parametroVerdadero2">Segundo parámetro de la función de transformación si se cumple la condición</param>
        /// <param name="transformacionFalso">Función de transformación si no se cumple la condición</param>
        /// <param name="origenFalso">Campo origen de la transformación si no se cumple la condición</param>
        /// <param name="destinoFalso">Campo destino de la transformación si no se cumple la condición</param>
        /// <param name="parametroFalso1">Primer parámetro de la función de transformación si no se cumple la condición</param>
        /// <param name="parametroFalso2">Segundo parámetro de la función de transformación si no se cumple la condición</param>
        /// <param name="campos">Lista de campos de la estructura</param>
        public FormDetalleCondicion(string condicion, string campoCondicion, string parametroCondicion1, string parametroCondicion2,
            string transformacionVerdadero, string origenVerdadero, string destinoVerdadero, string parametroVerdadero1, string parametroVerdadero2,
            string transformacionFalso, string origenFalso, string destinoFalso, string parametroFalso1, string parametroFalso2,
            List<string> campos)
        {
            InitializeComponent();
            this.comboBoxCampoCondicion.DataSource = new List<string>(campos);
            this.comboBoxOrigenVerdadero.DataSource = new List<string>(campos);
            this.comboBoxDestinoVerdadero.DataSource = new List<string>(campos);
            this.comboBoxOrigenFalso.DataSource = new List<string>(campos);
            this.comboBoxDestinoFalso.DataSource = new List<string>(campos);
            this.comboBoxTransformacionVerdadero.DataSource = new List<string>(new CListasFunciones().ListaFuncionesTransformacion);
            this.comboBoxTransformacionFalso.DataSource = new List<string>(new CListasFunciones().ListaFuncionesTransformacion);
            this.comboBoxComparacion.DataSource = new CListasFunciones().ListaFuncionesCondicion;
            if (!string.Empty.Equals(condicion) && this.comboBoxComparacion.Items.Contains(condicion))
            {
                // Comparación
                this.comboBoxComparacion.SelectedItem = condicion;

                if (this.comboBoxCampoCondicion.Items.Contains(campoCondicion))
                    this.comboBoxCampoCondicion.SelectedItem = campoCondicion;
                else
                    this.comboBoxCampoCondicion.SelectedItem = this.comboBoxCampoCondicion.Items[0];

                this.textBoxParametroComparacion1.Text = parametroCondicion1;
                this.textBoxParametroComparacion2.Text = parametroCondicion2;

                // Transformación Verdadero
                if (!string.Empty.Equals(transformacionVerdadero))
                {
                    if (this.comboBoxTransformacionVerdadero.Items.Contains(transformacionVerdadero))
                        this.comboBoxTransformacionVerdadero.SelectedItem = transformacionVerdadero;
                    else
                        this.comboBoxTransformacionVerdadero.SelectedItem = this.comboBoxTransformacionVerdadero.Items[0];

                    if (this.comboBoxOrigenVerdadero.Items.Contains(origenVerdadero))
                        this.comboBoxOrigenVerdadero.SelectedItem = origenVerdadero;
                    else
                        this.comboBoxOrigenVerdadero.SelectedItem = this.comboBoxOrigenVerdadero.Items[0];

                    if (this.comboBoxDestinoVerdadero.Items.Contains(destinoVerdadero))
                        this.comboBoxDestinoVerdadero.SelectedItem = destinoVerdadero;
                    else
                        this.comboBoxDestinoVerdadero.SelectedItem = this.comboBoxDestinoVerdadero.Items[0];

                    this.textBoxParametroVerdadero1.Text = parametroVerdadero1;
                    this.textBoxParametroVerdadero2.Text = parametroVerdadero2;
                    this.checkBoxTransformacionVerdadero.Checked = false;
                }
                else
                {
                    this.comboBoxTransformacionVerdadero.SelectedItem = this.comboBoxTransformacionVerdadero.Items[0];
                    this.comboBoxOrigenVerdadero.SelectedItem = this.comboBoxOrigenVerdadero.Items[0];
                    this.comboBoxDestinoVerdadero.SelectedItem = this.comboBoxDestinoVerdadero.Items[0];
                    this.checkBoxTransformacionVerdadero.Checked = true;
                }

                // Transformación Falso
                if (!string.Empty.Equals(transformacionFalso))
                {
                    if (this.comboBoxTransformacionFalso.Items.Contains(transformacionFalso))
                        this.comboBoxTransformacionFalso.SelectedItem = transformacionFalso;
                    else
                        this.comboBoxTransformacionFalso.SelectedItem = this.comboBoxTransformacionFalso.Items[0];

                    if (this.comboBoxOrigenFalso.Items.Contains(origenFalso))
                        this.comboBoxOrigenFalso.SelectedItem = origenFalso;
                    else
                        this.comboBoxOrigenFalso.SelectedItem = this.comboBoxOrigenFalso.Items[0];

                    if (this.comboBoxDestinoFalso.Items.Contains(destinoFalso))
                        this.comboBoxDestinoFalso.SelectedItem = destinoFalso;
                    else
                        this.comboBoxDestinoFalso.SelectedItem = this.comboBoxDestinoFalso.Items[0];

                    this.textBoxParametroFalso1.Text = parametroFalso1;
                    this.textBoxParametroFalso2.Text = parametroFalso2;
                    this.checkBoxTransformacionFalso.Checked = false;
                }
                else
                {
                    this.comboBoxTransformacionFalso.SelectedItem = this.comboBoxTransformacionFalso.Items[0];
                    this.comboBoxOrigenFalso.SelectedItem = this.comboBoxOrigenFalso.Items[0];
                    this.comboBoxDestinoFalso.SelectedItem = this.comboBoxDestinoFalso.Items[0];
                    this.checkBoxTransformacionFalso.Checked = true;
                }
            }
        }

        /// <summary>
        /// Obtiene los detalles de la condición a aplicar.
        /// </summary>
        /// <param name="condicion">Función de la condición a aplicar</param>
        /// <param name="campo">Campo sobre el que comprobar la condición</param>
        /// <param name="parm1">Primer parámetro de la función de condción</param>
        /// <param name="parm2">Segundo parámetro de la función de condción</param>
        public void obtenerCondicion(ref string condicion, ref string campo, ref string parm1, ref string parm2)
        {
            if (this.comboBoxCampoCondicion.SelectedItem != null)
                condicion = this.comboBoxComparacion.SelectedItem.ToString();
            else
                condicion = string.Empty;

            if (this.comboBoxCampoCondicion.SelectedItem != null)
                campo = this.comboBoxCampoCondicion.SelectedItem.ToString();
            else
                campo = string.Empty;

            parm1 = this.textBoxParametroComparacion1.Text;
            parm2 = this.textBoxParametroComparacion2.Text;
        }

        /// <summary>
        /// Obtiene los detalles de la transformación cuando se cumple la condición.
        /// </summary>
        /// <param name="transformacion">Transformación a realizar</param>
        /// <param name="campoOrigen">Campo origen de la transformación</param>
        /// <param name="campoDestino">Campo destino de la transformación</param>
        /// <param name="parm1">Primer parámetro de la transformación</param>
        /// <param name="parm2">Segundo parámetro de la transformación</param>
        public void obtenerTransformacionVerdadero(ref string transformacion, ref string campoOrigen, 
            ref string campoDestino, ref string parm1, ref string parm2)
        {
            if (!this.checkBoxTransformacionVerdadero.Checked)
            {
                if (this.comboBoxTransformacionVerdadero.SelectedItem != null)
                    transformacion = this.comboBoxTransformacionVerdadero.SelectedItem.ToString();
                else
                    transformacion = string.Empty;

                if (this.comboBoxOrigenVerdadero.SelectedItem != null)
                    campoOrigen = this.comboBoxOrigenVerdadero.SelectedItem.ToString();
                else
                    campoOrigen = string.Empty;

                if (this.comboBoxDestinoVerdadero.SelectedItem != null)
                    campoDestino = this.comboBoxDestinoVerdadero.SelectedItem.ToString();
                else
                    campoDestino = string.Empty;

                parm1 = this.textBoxParametroVerdadero1.Text;
                parm2 = this.textBoxParametroVerdadero2.Text;
            }
            else
            {
                transformacion = string.Empty;
                campoOrigen = string.Empty;
                campoDestino = string.Empty;
                parm1 = string.Empty;
                parm2 = string.Empty;
            }
        }

        /// <summary>
        /// Obtiene los detalles de la transformación cuando no se cumple la condición.
        /// </summary>
        /// <param name="transformacion">Transformación a realizar</param>
        /// <param name="campoOrigen">Campo origen de la transformación</param>
        /// <param name="campoDestino">Campo destino de la transformación</param>
        /// <param name="parm1">Primer parámetro de la transformación</param>
        /// <param name="parm2">Segundo parámetro de la transformación</param>
        public void obtenerTransformacionFalso(ref string transformacion, ref string campoOrigen,
            ref string campoDestino, ref string parm1, ref string parm2)
        {
            if (!this.checkBoxTransformacionFalso.Checked)
            {
                if (this.comboBoxTransformacionFalso.SelectedItem != null)
                    transformacion = this.comboBoxTransformacionFalso.SelectedItem.ToString();
                else
                    transformacion = string.Empty;

                if (this.comboBoxOrigenFalso.SelectedItem != null)
                    campoOrigen = this.comboBoxOrigenFalso.SelectedItem.ToString();
                else
                    campoOrigen = string.Empty;

                if (this.comboBoxDestinoFalso.SelectedItem != null)
                    campoDestino = this.comboBoxDestinoFalso.SelectedItem.ToString();
                else
                    campoDestino = string.Empty;

                parm1 = this.textBoxParametroFalso1.Text;
                parm2 = this.textBoxParametroFalso2.Text;
            }
            else
            {
                transformacion = string.Empty;
                campoOrigen = string.Empty;
                campoDestino = string.Empty;
                parm1 = string.Empty;
                parm2 = string.Empty;
            }
        }

        /// <summary>
        /// Habilita controles.
        /// </summary>
        /// <param name="condicionVerdadero">Afecta a los controles de la transformación verdadero</param>
        /// <param name="habilitar">Habilita o deshabilita los controles</param>
        private void habilitarControles(bool condicionVerdadero, bool habilitar)
        {
            if (condicionVerdadero)
            {
                this.comboBoxTransformacionVerdadero.Enabled = habilitar;
                this.comboBoxOrigenVerdadero.Enabled = habilitar;
                this.comboBoxDestinoVerdadero.Enabled = habilitar;
                this.textBoxParametroVerdadero1.Enabled = habilitar;
                this.textBoxParametroVerdadero2.Enabled = habilitar;
            }
            else
            {
                this.comboBoxTransformacionFalso.Enabled = habilitar;
                this.comboBoxOrigenFalso.Enabled = habilitar;
                this.comboBoxDestinoFalso.Enabled = habilitar;
                this.textBoxParametroFalso1.Enabled = habilitar;
                this.textBoxParametroFalso2.Enabled = habilitar;
            }
        }

        /// <summary>
        /// Manejador del evento producido al cambiar el estado del checkbox.
        /// </summary>
        /// <param name="sender">Objeto que envía el evento</param>
        /// <param name="e">Parámetros del evento</param>
        void checkBoxTransformacionVerdadero_CheckedChanged(object sender, System.EventArgs e)
        {
            this.habilitarControles(true, !this.checkBoxTransformacionVerdadero.Checked);
        }

        /// <summary>
        /// Manejador del evento producido al cambiar el estado del checkbox.
        /// </summary>
        /// <param name="sender">Objeto que envía el evento</param>
        /// <param name="e">Parámetros del evento</param>
        void checkBoxTransformacionFalso_CheckedChanged(object sender, System.EventArgs e)
        {
            this.habilitarControles(false, !this.checkBoxTransformacionFalso.Checked);
        }
    }
} 